#include <STC15F2K60S2.H>
#include "Key.h"
#include "LED.h"
#include "Seg.h"
#include "Init.h"
#include "ds1302.h"
#include "iic.h"

//旧V2模版
//第十五届省赛真题(摸底尝试,复试加借鉴满分模版)
#define unchar unsigned char
#define unint  unsigned int
	
unchar key_down,key_value,key_old;
unchar key_scan_down;
unchar seg_scan_down;
unchar seg_diap[8]={10,10,10,10,10,10,10,10};
unchar seg_index;
unchar seg_point[8]={0,0,0,0,0,0,0,0};
unchar LED_disp[8]={0,0,0,0,0,0,0,0};

unint frequent;//频率读取值
unint time_1000ms;//频率计时周期
unchar Seg_mode;//界面切换 0-->频率 1-->参数 2-->时间 3-->回显
unchar mode1;//0-->超限参数  1-->校准值参数
unchar mode2;//0-->频率回显  1-->时间回显
unint   fre_mmax=2000;//超限频率参数
unint  fre_max;//最大频率参数
int  cen_unt;//校准值参数
bit fre_flag;//用来判定频率是否正常
unchar ret_time[3]={13,3,5};//时间设置
unchar code_time[3]={0};//记录的时间
bit LED1_flag;
bit LED2_flag;
bit warining_flag;

unchar time_200ms;
unchar LED1time_200msflag;
unchar LED2time_200msflag;
float DA_output;//DA输出


void KE_proc()
{
	if(key_scan_down)  return ;
	key_scan_down=1;
	
	key_value=Key_read();
	key_down=key_value&(key_value^key_old);
	key_old=key_value;
	
	if(key_down==4)
	{
		if(++Seg_mode==4)  Seg_mode=0;
		mode1=0;
		mode2=0;
	}
	if(key_down==5)
	{
		if(Seg_mode==1)//在参数界面，子界面的切换
		{
			mode1^=1;
		}
		if(Seg_mode==3)//在回显界面，子界面的切换
		{
			mode2^=1;
		}
	}
	if(key_down==8)
	{
		if(Seg_mode==1&&mode1==0) //参数子界面--超限频率的加法运算
		{
		    fre_mmax+=1000;
			if(fre_mmax==10000)
			{
				fre_mmax=9000;
			}
		}
		if(Seg_mode==1&&mode1==1)
		{
			 cen_unt+=100;
			if(cen_unt==1000)
			{
				cen_unt=900;
			}
		}
	}
	if(key_down==9)//参数子界面--超限频率的减法运算
	{
		if(Seg_mode==1&&mode1==0)
		{
		    fre_mmax-=1000;
			if(fre_mmax==0)
			{
				fre_mmax=1000;
			}
			
		}
		if(Seg_mode==1&&mode1==1)
		{
			 cen_unt-=100;
			if(cen_unt==-1000)
			{
				cen_unt=-900;
			}
		}
	}
}

void SE_proc()
{
	unchar i;
	if(seg_scan_down)  return ;
	seg_scan_down=1;
	
	Read_time(ret_time);
	
	switch(Seg_mode)
	{
		case 0://频率界面
			seg_diap[0]=12;
		    seg_diap[1]=seg_diap[2]=10;
		if(fre_flag==0) //正常时
		{
			seg_diap[3]=frequent/10000%10;
			seg_diap[4]=frequent/1000%10;
			seg_diap[5]=frequent/100%10;
			seg_diap[6]=frequent/10%10;
			seg_diap[7]=frequent%10;
		}
		else  //不正常时,即实际频率为负值
		{
			seg_diap[3]=10;
			seg_diap[4]=10;
			seg_diap[5]=10;
			seg_diap[6]=16;
			seg_diap[7]=16;
		}
		for(i=3;seg_diap[i]==0&&i<7;i++)//对实际频率的位数进行处理(值为0时，高位为空)
		{
			seg_diap[i]=10;
		}
		break;
		case 1://参数界面
			seg_diap[0]=13;
		    seg_diap[1]=mode1+1;
		    seg_diap[2]=seg_diap[3]=10;
		    if(mode1==0)//超限频率最低的位数为4位
			{
				seg_diap[4]=fre_mmax/1000%10;
				seg_diap[5]=fre_mmax/100%10;
				seg_diap[6]=fre_mmax/10%10;
				seg_diap[7]=fre_mmax%10;
			}
			else //校准值
			{
				if(cen_unt<0)//校准值为负
				{
					//cen_unt = cen_unt *(-1);//这个还不能改，为啥因为扫描速度飞快，改变cen_unt<0易造成下面,真实频率的值
					seg_diap[4]=11;
					seg_diap[5]=(-1)*(cen_unt)/100%10;
					seg_diap[6]=(-1)*(cen_unt)/10%10;
					seg_diap[7]=(-1)*(cen_unt)%10;
				}
				else //校准值为正
				{
					seg_diap[4]=10;
					seg_diap[5]=(cen_unt)/100%10==0?10:(cen_unt)/100%10;
					seg_diap[6]=((cen_unt)/10%10==0&&seg_diap[5]==10)?10:(cen_unt)/10%10;
					seg_diap[7]=(cen_unt)%10;
				}
			}
		break;
		case 2://时间界面
			seg_diap[0]=ret_time[0]/10%10;
		    seg_diap[1]=ret_time[0]%10;
		    seg_diap[2]=11;
			seg_diap[3]=ret_time[1]/10%10;;
			seg_diap[4]=ret_time[1]%10;;
			seg_diap[5]=11;
			seg_diap[6]=ret_time[2]/10%10;;
			seg_diap[7]=ret_time[2]%10;;
		break;
		case 3://回显界面
			if(mode2==0)//最大值频率
			{
				seg_diap[0]=14;
				seg_diap[1]=12;
				seg_diap[2]=10;
				seg_diap[3]=fre_max/10000%10;
				seg_diap[4]=fre_max/1000%10;
				seg_diap[5]=fre_max/100%10;
				seg_diap[6]=fre_max/10%10;
				seg_diap[7]=fre_max%10;
				for(i=3;seg_diap[i]==0&&i<7;i++)
				{
					seg_diap[i]=10;
				}
			}
			else //读取最大值的时间
			{
				seg_diap[0]=14;
				seg_diap[1]=15;
				seg_diap[2]=code_time[0]/10%10;
				seg_diap[3]=code_time[0]%10;
				seg_diap[4]=code_time[1]/10%10;
				seg_diap[5]=code_time[1]%10;
				seg_diap[6]=code_time[2]/10%10;
				seg_diap[7]=code_time[2]%10;
			}
		break;
	}
}

void LED_proc()
{
	//借鉴-频率值的判定-DA_output输出
	if(frequent>64000)//当频率值为负值时
	{
		fre_flag=1; //频率显示不正常
	}
	else
	{
		fre_flag=0; //频率显示正常
	}
	
	if(fre_flag==0&&frequent>fre_max) //当频率大于最大频率时
	{
		fre_max=frequent;
		code_time[0]=ret_time[0];//记录此时的时间
		code_time[1]=ret_time[1];
		code_time[2]=ret_time[2];
	}
	
	if(fre_flag==0&&frequent>fre_mmax) //当频率大于超限值时
	{
		warining_flag=1;
	}
	else
		warining_flag=0;//关闭警告
	
	LED_disp[0]=LED1_flag;
	LED_disp[1]=LED2_flag ||fre_flag;
	
	
	if(time_200ms) return ;
	time_200ms=1;
	
	if(fre_flag==0)
	{
		if(frequent<=500)
		{
		  DA_output=1;	
		}
		else if(frequent>=fre_mmax)
		{
		  DA_output=5;
		}
		else
		{
			DA_output=(4.0/(fre_mmax-500))*(frequent-500) +1;
		}
	}
	else
	{
		DA_output=0;
	}
	 DA_Output(DA_output*51);
}

void Timer0Init(void)		//0微秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x05;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0x00;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}


void Timer1Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x18;		//设置定时初值
	TH1 = 0xFC;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	ET1=1;
	EA=1;
}

void Timer1Serve() interrupt 3
{
	if(++key_scan_down==10) key_scan_down=0;
	if(++seg_scan_down==250) seg_scan_down=0;
	if(++seg_index==8)  seg_index=0;
	Seg_Disp(seg_index,seg_diap[seg_index],seg_point[seg_index]);
	LED_Show(seg_index,LED_disp[seg_index]);
	if(++time_1000ms==1000)//一千毫秒一次读取，每一次都记录的时间，一千的间隙逐够
	{
		frequent=(TH0<<8 | TL0)+cen_unt;
		TH0=TL0=time_1000ms=0;
	}
	
	//	if(Seg_mode==0 && ++LED1time_200msflag==200)//这样写不对
//	{

//	}
//	else
//	{
//		LED1time_200msflag=0;
//	}
	if(Seg_mode==0)
	{
		if(++LED1time_200msflag==200)
		{
			LED1time_200msflag=0;
			LED1_flag^=1;
		}
	}
	else
	{
		LED1time_200msflag=0;
		LED1_flag=0;
	}
		
	if(++time_200ms==200)
	{
		time_200ms=0;
	}
	
//	if(warining_flag==1&& ++LED2time_200msflag==200)
//	{

//	}
//	else
//	{
//		LED2time_200msflag=0;
//	}
	if(warining_flag==1)
	{
		if(++LED2time_200msflag==200)
		{
			LED2time_200msflag=0;
			LED2_flag^=1;
		}
	}
	else
	{
		LED2time_200msflag=0;
		LED2_flag=0;
	}
}

void main()
{
	system_Init();
	Timer1Init();
	Timer0Init();
	Set_time(ret_time);
	while(1)
	{
		KE_proc();
		SE_proc();
		LED_proc();	
	}	
}